package br.uniceub.fsw.academicmobile.dao;

import br.uniceub.fsw.academicmobile.vo.AulaVO;
import br.uniceub.fsw.academicmobile.vo.TurmaVO;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Dao responsável pelas operaçoes de banco associadas ao objeto aula
 * @author Dejavu
 */
public class AulaDAO {

	private BD bd;
        SimpleDateFormat formato;
        
	public AulaDAO() {
		bd = new BD();
                formato = new SimpleDateFormat("yyyy-MM-dd");
	}
	
        /**
         * Retorna objeto aula apartir de seu id
         * @param aula vo carregando id da aula
         * @return objeto AulaVO
         */
	public AulaVO ConsultarAulaPorId(AulaVO aula){
            String SQL = "SELECT * FROM tb_aula WHERE ID_aula = '<01>'";
            SQL = SQL.replaceAll("<01>", aula.getIdAula().toString());
            AulaVO a = new AulaVO();
            try{
                ResultSet rs = bd.getResultSet(SQL);
                if(rs.next()){     
                    a.setIdAula(rs.getInt("ID_aula"));
                    a.setTbTurmaIdTurma(rs.getInt("tb_turma_ID_turma"));
                    a.setDtAula((Date) rs.getTimestamp("DT_aula"));
                    a.setTeAula(rs.getString("TE_aula"));
                }
            } catch (Exception ex){
                System.err.println("AulaDAO.ConsultarAulaPorId:"
                                    + ex.getMessage());
            }
            return a;
	}
        
        /**
         * Retorna conjunto de aulas apartir do mês e turma
         * @param mes mes da aula
         * @param turma vo carregando id da turma a qual a aula está associada
         * @return ArrayList de aulas
         */
        public ArrayList consultarAulaPorMesTurma(int mes, TurmaVO turma){
            String SQL = "SELECT * FROM tb_aula WHERE Month(DT_aula) =<01> AND tb_turma_ID_turma =<02>" +
                    " ORDER BY DT_aula";
            SQL = SQL.replaceAll("<01>", Integer.toString(mes));
            SQL = SQL.replaceAll("<02>", turma.getIdTurma().toString());
            ArrayList lista = new ArrayList();
            try{
                ResultSet rs = bd.getResultSet(SQL);
                while(rs.next()){
                    AulaVO a = new AulaVO();
                    a.setIdAula(rs.getInt("ID_aula"));
                    a.setTbTurmaIdTurma(rs.getInt("tb_turma_ID_turma"));
                    a.setDtAula((Date) rs.getTimestamp("DT_aula"));
                    a.setTeAula(rs.getString("TE_aula"));
                    lista.add(a);
                }
            } catch (Exception ex){
                System.err.println("AulaDAO.consultarAulaPorMes:"
                                    + ex.getMessage());
            }
            return lista;
        }
	
        /**
         * Retorna aulas a partir de uma turma
         * @param turma vo com id da turma
         * @return ArrayList de aulas associadas à turma
         */
        public ArrayList consultarAulaPorTurma (TurmaVO turma){
            String SQL = "SELECT * FROM tb_aula WHERE tb_turma_ID_turma = <01> " +
                    "ORDER BY DT_aula";
            SQL = SQL.replaceAll("<01>", turma.getIdTurma().toString());
            ArrayList aList = new ArrayList();
            try{
                ResultSet rs = bd.getResultSet(SQL);
                while(rs.next()){
                    AulaVO a = new AulaVO();
                    a.setIdAula(rs.getInt("ID_aula"));
                    a.setTbTurmaIdTurma(rs.getInt("tb_turma_ID_turma"));
                    a.setDtAula(rs.getDate("DT_aula"));
                    a.setTeAula(rs.getString("TE_aula"));
                    aList.add(a);
                }
            } catch (Exception ex){
                System.err.println("AulaDAO.consultarAulaPorTurma: " + ex.getMessage());
            }
            return aList;
        }
        
        /**
         * Retorna aula a partir da data específica e a turma associada
         * @param aula objeto aula carregando id da turma e data precisa da aula
         * @return AulaVO objeto aula
         */
        public AulaVO consultarAulaPorDataTurma(AulaVO aula){
             String SQL = "SELECT * FROM tb_aula WHERE tb_turma_ID_turma = <01> AND " +
                     "DT_aula = '<02>'";
            SQL = SQL.replaceAll("<01>", aula.getTbTurmaIdTurma().toString());
            SQL = SQL.replaceAll("<02>", formato.format(aula.getDtAula()));
            AulaVO a;
            try{
                ResultSet rs = bd.getResultSet(SQL);
                if(rs.next()){
                    a = new AulaVO();
                    a.setIdAula(rs.getInt("ID_aula"));
                    a.setTbTurmaIdTurma(rs.getInt("tb_turma_ID_turma"));
                    a.setDtAula(rs.getDate("DT_aula"));
                    a.setTeAula(rs.getString("TE_aula"));
                    return a;
                }
            } catch (Exception ex){
                System.err.println("AulaDAO.consultarAulaPorData: " + ex.getMessage());
            }
            return null;
        }
        
        /**
         * Altera os dados da aula no banco
         * @param aula vo carregando dados da aula
         * @return boolean true caso haja sucesso
         */
        public boolean alterarAula(AulaVO aula){
            String SQL = "UPDATE tb_aula SET TE_aula=? , tb_turma_ID_turma=? , DT_aula=?" +
                     " WHERE ID_aula=?";
            boolean retorno = true;
		try {
			PreparedStatement ps = bd.getCn().prepareStatement(SQL);
			ps.setString(1, aula.getTeAula());
                        ps.setInt(2, aula.getTbTurmaIdTurma());
                        ps.setString(3, formato.format(aula.getDtAula()));
			ps.setInt(4, aula.getIdAula());
			ps.execute();
		} catch (SQLException ex) {
			retorno = false;
			System.err.println("AulaDAO.alterarAula: "
					+ ex.getMessage());
		}
            return retorno;
        }
        
        /**
         * Retorna conjunto de aulas a partir d uma turmaAulaVO
         * @param tVO vo carregando o id da turma
         * @return List lista de aulas
         * @throws java.lang.Exception
         */
        public List<AulaVO> getAulaByTurma(TurmaVO tVO)throws Exception{
                String SQL="select * from tb_aula where tb_turma_ID_turma="+tVO.getIdTurma(); 
  		ResultSet rs = bd.getResultSet(SQL);
  		ArrayList listaAula=new ArrayList<AulaVO>();
                if(rs == null){
                    
                } else {
                    while(rs.next()){
                            AulaVO aVO = new AulaVO();
                            aVO.setIdAula(rs.getInt("ID_aula"));
                            aVO.setTbTurmaIdTurma(rs.getInt("tb_turma_ID_turma"));
                            aVO.getTurma();
                            aVO.setTeAula(rs.getString("TE_aula")); 
                            aVO.setDtAula(rs.getDate("DT_aula"));
                        listaAula.add(aVO);
                    } 
                }
  		bd.finalize();
  		return listaAula;
      }
        
      /**
       * Inclui uma aula no banco
       * @param aula vo com os dados da aula
       * @return boolean true caso haja sucesso
       */
      public boolean incluirAula(AulaVO aula){
          
          String SQL = "INSERT INTO tb_aula (tb_turma_ID_turma, DT_aula, TE_aula) values (<01>,'<02>','<03>')";
          SQL = SQL.replaceAll("<01>", aula.getTbTurmaIdTurma().toString());
          SQL = SQL.replaceAll("<02>", formato.format(aula.getDtAula()));
          SQL = SQL.replaceAll("<03>", aula.getTeAula());
          return bd.execSQL(SQL);
      }
      
      /**
       * Exclui uma aula no banco
       * @param aula vo com id da aula
       * @return boolean true caso haja sucesso
       */
      public boolean excluirAula(AulaVO aula){
          String SQL = "DELETE FROM tb_aula WHERE ID_aula = <01>";
          SQL = SQL.replaceAll("<01>", aula.getIdAula().toString());
          return bd.execSQL(SQL);
      }
        
}
